//
// Created by hsj on 2024-1-4.
// ************************
// UDP没有listen、accept
// 当然，针对UDP套接字调用connect函数并不意味着要与对方UDP套接字连接，这只是向UDP套接字注册目标IP和端口信息。
// ************************
//

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>

#ifdef WIN32
//windows minGW64
//inet_ntop函数：_WIN32_WINNT
#ifdef _WIN32_WINNT
#undef _WIN32_WINNT
#endif
#define _WIN32_WINNT 0x0600
#include <winsock2.h>
#include <ws2tcpip.h>
//#pragma comment(lib,"ws2_32.lib")
#else
//linux  gcc
#include <arpa/inet.h>
#include <sys/socket.h>
#include <netinet/in.h>
#endif

#define BUF_SIZE 30
void error_handling( char *message);

int main(int argc, char *argv[] ){
    int sock;
    char message[BUF_SIZE];
    int str_len;
    socklen_t adr_sz;
    struct sockaddr_in serv_adr/*, from_adr*/;//改用connect，不再需要from_adr

    char ip[]="127.0.0.1";
    char port[]="7788";

//    if(argc!=3){
//        printf("Usage : %s <IP> <port>\n", argv[0]);
//        exit(1);
//    }

    sock=socket(PF_INET, SOCK_DGRAM,0);
    if(sock==-1)
        error_handling("socket() error" );

    memset(&serv_adr, 0, sizeof(serv_adr));
    serv_adr.sin_family=AF_INET;
    serv_adr.sin_addr.s_addr=inet_addr(/*argv[1]*/ip);
    serv_adr.sin_port=htons(atoi(/*argv[2]*/port));

    connect(sock,(struct sockaddr*)&serv_adr, sizeof(serv_adr));//改用connect

    while(1){//死循环
        fputs("Insert message(q to quit): ",stdout);
        fgets (message, sizeof(message), stdin);

        if( !strcmp(message, "q\n") || !strcmp (message, "Q\n"))
            break;

        /*sendto(sock, message, strlen(message), 0,(struct sockaddr*)&serv_adr, sizeof(serv_adr));*/ //改用connect,不再需要sendto
        write(sock,message, strlen(message)); //改用connect

       /* adr_sz=sizeof(from_adr);
        //client端为什么换一个from_adr，避免覆盖发送的serv_adr数据信息
        str_len=recvfrom(sock, message, BUF_SIZE, 0,(struct sockaddr*)&from_adr, &adr_sz);*/ //改用connect,不再需要recvfrom

        str_len=read(sock,message,BUF_SIZE-1);//改用connect

        message[str_len]=0;
        printf( "Message from server: %s",message);
    }
    close(sock);

    return EXIT_SUCCESS;
}

void error_handling( char *message){
    fputs (message, stderr);
    fputc('\n', stderr);
    exit(1);
}